
#include "Run_TxtLrn.h"

int main(int argc, const char* argv[])
{
	int nRetCode = 0;
	CMyRandom::InitRandomSeed();
	CImageEx::Initialize();
	char strTemp[10001] = "";

	if (1)
	{
		if (1)
		{
			string strPN_Prefix = "D:\\HiBoost\\TxtLrn\\03\\";
			string strExpName = "sci_vs_talk";
			string strModelName_1 = "svm";
			string strModelName_2 = "knn";

			sprintf_s(strTemp, "%s%s\\logs\\", strPN_Prefix.c_str(), strExpName.c_str());
			string strPN_Base = strTemp;
			sprintf_s(strTemp, "%s%s\\analysis.log", strPN_Prefix.c_str(), strExpName.c_str());
			ofstream outLog(strTemp);

			int i1, i2, i3;
			string strFN_Log;
			for ( i2 = 1; i2 <= 2; ++i2 ) for ( i3 = -1; i3 < 10; ++i3 ) for ( i1 = 1; i1 <= 8; ++i1 )
			{
				if (i3 < 0)
				{
					if (i2>1 || i1>1) break;
					sprintf_s(strTemp, "%s%d.base.%s.log", strPN_Base.c_str(), i1, strModelName_1.c_str());
				}
				else
				{
					sprintf_s(strTemp, "%s%d.%c%d.%s.log", strPN_Base.c_str(), i1, (i2==1 ? 'e' : 'h'), i3, strModelName_2.c_str());
				}

				CExternalTools::ConsoleTools::MakeCurrentLine(strTemp, true);
				strFN_Log = strTemp;
				ifstream inFile(strTemp);
				int t = 0;
				double p;
				while (inFile>>strTemp)
				{
					if (strcmp(strTemp, "Acc")==0)
					{
						++t;
						if (t == 2)
						{
							inFile>>strTemp>>p;
							// comp_vs_rec	0 	All	1.00 	1.00 	96.60 
							if (i3 < 0)
							{
								sprintf_s(strTemp, "%s\t%d\t%s\t%.2lf\t%.2lf\t%.2lf",
									strExpName.c_str(), 0, "All", 1.00, 1.00, p);
							}
							else
							{
								sprintf_s(strTemp, "%s\t%d\t%s\t%.2lf\t%.2lf\t%.2lf",
									strExpName.c_str(), i1, (i2==1 ? "Easy" : "Hard"),
									0.24 + 0.08 * i3,
									0.24 + 0.08 * i3 + (i2==1 ? -0.01 : +0.01),
									p);
							}
							outLog<<strTemp<<endl;
						}
					}
				}
				inFile.close();
				inFile.clear();
			}

			outLog.close();
			outLog.clear();
			exit(0);
		}

		string strFN_PNS		=	argv[1];

		//string strFN_Configuration		=	argv[1];
		//string strOperation				=	argv[2];
		//strOperation += "00000000";
		//int op_SVM_TrainTest = CDataStructureTools::Hex2Num(strOperation[0]);
		//////////	Config Loading	//////////
		//CConfiguration Config(strFN_Configuration);
		//Config.Load();

		string strPN_Exp = "exps\\";
		string strPN_Config = "configs\\";
		string strPN_Bat = "bats\\";
		string strPN_Log = "logs\\";

		string strFN_LS_Train = "LabelSettings.Train.ini";
		string strFN_LS_Test = "LabelSettings.Test.ini";
		string strFN_Build = "build.win32.bat";
		//string strFN_Config = "Config.ini";
		string strFN_Log = "global.log";
		string strFN_Exe = "TxtLrn.exe";

		// ********** Main Code Start **********
		if (strFN_PNS != "")
		{
			// Read Pos Neg Settings
			string strExpPrefix;
			CSimpleTypeArray<int> PosList;
			CSimpleTypeArray<int> NegList;
			{
				ifstream inFile(strFN_PNS.c_str());
				inFile>>strExpPrefix;
				PosList.Clear();
				NegList.Clear();
				while (inFile>>strTemp && strTemp[0]!='#') PosList.PushBack(atoi(strTemp));
				while (inFile>>strTemp && strTemp[0]!='#') NegList.PushBack(atoi(strTemp));
				inFile.close();
				inFile.clear();
			}

			CExternalTools::ConsoleTools::MakeDirectory(strPN_Exp);
			CExternalTools::ConsoleTools::MakeDirectory(strPN_Config);
			CExternalTools::ConsoleTools::MakeDirectory(strPN_Bat);
			CExternalTools::ConsoleTools::MakeDirectory(strPN_Log);

			string strPN_TargetExp;
			string strFN_TargetExpLog;
			string strFN_TargetExpBat;
			int i_poslabel, i_mode, i_config;
			for ( i_poslabel = 0; i_poslabel < (int)PosList.Size; ++i_poslabel ) for ( i_mode = 1; i_mode < 3; ++i_mode ) for ( i_config = 0; i_config < 10; ++i_config )
			{
				const char* cpModeName = "";
				if (i_mode == 0) cpModeName = "full";
				if (i_mode == 1) cpModeName = "hard";
				if (i_mode == 2) cpModeName = "easy";

				sprintf_s(strTemp, "%s%s.%d.%s.%d\\", strPN_Exp.c_str(), strExpPrefix.c_str(), PosList.pElement[i_poslabel], cpModeName, i_config);
				strPN_TargetExp = strTemp;
				sprintf_s(strTemp, "%s%s.%d.%s.%d.bat", strPN_Bat.c_str(), strExpPrefix.c_str(), PosList.pElement[i_poslabel], cpModeName, i_config);
				strFN_TargetExpBat = strTemp;
				sprintf_s(strTemp, "%s%s.%d.%s.%d.log", strPN_Log.c_str(), strExpPrefix.c_str(), PosList.pElement[i_poslabel], cpModeName, i_config);
				strFN_TargetExpLog = strTemp;

				CExternalTools::ConsoleTools::MakeDirectory(strPN_TargetExp, true);
				int i;

				sprintf_s(strTemp, "%s\\%s", strPN_TargetExp.c_str(), strFN_LS_Train.c_str());
				ofstream outFile_LS_Train(strTemp);
				for ( i = 0; i < (int)PosList.Size; ++i )
				{
					if (i!=i_poslabel) continue;
					outFile_LS_Train<<" "<<PosList.pElement[i];
				}
				outFile_LS_Train<<"\t#"<<endl;
				if (i_mode != 2)
				{
					for ( i = 0; i < (int)PosList.Size; ++i )
					{
						if (i==i_poslabel) continue;
						outFile_LS_Train<<" "<<PosList.pElement[i];
					}
				}
				if (i_mode != 1)
				{
					for ( i = 0; i < (int)NegList.Size; ++i )
						outFile_LS_Train<<" "<<NegList.pElement[i];
				}
				outFile_LS_Train<<"\t#"<<endl;
				outFile_LS_Train.close();
				outFile_LS_Train.clear();

				sprintf_s(strTemp, "%s\\%s", strPN_TargetExp.c_str(), strFN_LS_Test.c_str());
				ofstream outFile_LS_Test(strTemp);
				for ( i = 0; i < (int)PosList.Size; ++i )
				{
					if (i!=i_poslabel) continue;
					outFile_LS_Test<<" "<<PosList.pElement[i];
				}
				outFile_LS_Test<<"\t#"<<endl;
				if (0)
				{
					for ( i = 0; i < (int)PosList.Size; ++i )
					{
						if (i==i_poslabel) continue;
						outFile_LS_Test<<" "<<PosList.pElement[i];
					}
				}
				if (0)
				{
					for ( i = 0; i < (int)NegList.Size; ++i )
						outFile_LS_Test<<" "<<NegList.pElement[i];
				}
				outFile_LS_Test<<"\t#"<<endl;
				outFile_LS_Test.close();
				outFile_LS_Test.clear();

				ofstream outFile_bat(strFN_TargetExpBat.c_str());

				sprintf_s(strTemp, "cd %s", strPN_TargetExp.c_str()); outFile_bat<<strTemp<<endl;
				sprintf_s(strTemp, "copy ..\\..\\%s", strFN_Build.c_str()); outFile_bat<<strTemp<<endl;

				sprintf_s(strTemp, "..\\..\\%sConfig.%d.ini", strPN_Config.c_str(), i_config);
				string strFN_TargetConfig = strTemp;
				//sprintf_s(strTemp, "copy ..\\..\\%s", strFN_Config.c_str()); outFile_bat<<strTemp<<endl;
				sprintf_s(strTemp, "copy %s Config.%d.ini", strFN_TargetConfig.c_str(), i_config); outFile_bat<<strTemp<<endl;

				sprintf_s(strTemp, "call %s", strFN_Build.c_str()); outFile_bat<<strTemp<<endl;

				//sprintf_s(strTemp, "%s %s 30", strFN_Exe.c_str(), strFN_Config.c_str()); outFile_bat<<strTemp<<endl;
				sprintf_s(strTemp, "%s Config.%d.ini 30", strFN_Exe.c_str(), i_config); outFile_bat<<strTemp<<endl;

				sprintf_s(strTemp, "copy %s ..\\..\\%s", strFN_Log.c_str(), strFN_TargetExpLog.c_str()); outFile_bat<<strTemp<<endl;
				sprintf_s(strTemp, "del 0.%s", strFN_Log.c_str()); outFile_bat<<strTemp<<endl;
				sprintf_s(strTemp, "ren %s 0.%s", strFN_Log.c_str(), strFN_Log.c_str()); outFile_bat<<strTemp<<endl;
				sprintf_s(strTemp, "cd ..\\..\\"); outFile_bat<<strTemp<<endl;
				outFile_bat.close();
				outFile_bat.clear();

				sprintf_s(strTemp, "call %s", strFN_TargetExpBat.c_str()); CExternalTools::ConsoleTools::RunDosCommand("", strTemp);
				//sprintf_s(strTemp, "del %s", strFN_TargetExpBat.c_str()); CExternalTools::ConsoleTools::RunDosCommand("", strTemp);
			} // i_mode, i_poslabel

		} // Main Code
	}

	CImageEx::Release();
	return 0;
}

////
//
//if (0)
//{
//	string strPN_Base = "D:\\HiBoost\\TxtLrn\\02\\logs\\";
//	ofstream outLog("D:\\HiBoost\\TxtLrn\\02\\p.global.log");
//
//	int i1, i2, i3;
//	string strFN_Log;
//	for ( i1 = 2; i1 <= 6; ++i1 ) for ( i2 = 1; i2 <= 2; ++i2 ) for ( i3 = 0; i3 <= 9; ++i3 )
//	{
//		string strBigSet;
//		string strExpSet;
//		strBigSet = "comp";
//		if (i2 == 0) strExpSet = "Full";
//		if (i2 == 1) strExpSet = "Easy";
//		if (i2 == 2) strExpSet = "Hard";
//		sprintf_s(strTemp, "%s%s.%d.%s.%d.log", strPN_Base.c_str(), strBigSet.c_str(), i1, strExpSet.c_str(), i3);
//		strFN_Log = strTemp;
//		ifstream inFile(strTemp);
//		int t = 0;
//		int ts = 0;
//		double sr;
//		double p;
//		while (inFile>>strTemp)
//		{
//			if (strcmp(strTemp, "Neg")==0)
//			{
//				++ts;
//				if (ts == 1)
//				{
//					inFile>>strTemp;
//					sscanf_s(strTemp+1, "%lf", &sr);
//					sr /= 100.0;
//				}
//			}
//			if (strcmp(strTemp, "Acc")==0)
//			{
//				++t;
//				if (t == 2)
//				{
//					inFile>>strTemp>>p;
//					sprintf_s(strTemp, "%s.%d\t%d\t%s\t%.2lf\t%.2lf",
//						strExpSet.c_str(), i1,
//						0, strExpSet.c_str(),
//						sr, p);
//					outLog<<strTemp<<endl;
//				}
//			}
//		}
//		inFile.close();
//		inFile.clear();
//	}
//
//	outLog.close();
//	outLog.clear();
//	exit(0);
//}
//if (0)
//{
//	string strPN_Base = "D:\\HiBoost\\CurLrn\\Itr.02\\h.logs\\";
//	ofstream outLog("D:\\HiBoost\\CurLrn\\Itr.02\\h.global.log");
//
//	int i1, i3;
//	string strFN_Log;
//	for ( i1 = 1; i1 <= 4; ++i1 ) for ( i3 = 1; i3 <= 8; ++i3 )
//	{
//		sprintf_s(strTemp, "%s%c%c.%c%04d.log", strPN_Base.c_str(), 'h', i1+'0', 'h', i3*100);
//		strFN_Log = strTemp;
//		ifstream inFile(strTemp);
//		int t = 0;
//		int awl;
//		double p;
//		while (inFile>>strTemp)
//		{
//			if (strcmp(strTemp, "#.WL")==0)
//			{
//				inFile>>strTemp>>awl;
//			}
//			if (strcmp(strTemp, "MR-4")==0)
//			{
//				++t;
//				if (t == 2)
//				{
//					inFile>>strTemp>>p;
//					sprintf_s(strTemp, "%s\t%d\t%.2lf\t%d",
//						"Easy",
//						i3*100,
//						p*100.0,
//						awl
//						);
//					outLog<<strTemp<<endl;
//				}
//			}
//		}
//		inFile.close();
//		inFile.clear();
//	}
//
//	outLog.close();
//	outLog.clear();
//	exit(0);
//}
//
////
//
